#include "funcProcAtomCrear.h"

void reemplazar_struct_coleccion(TipoStruct * reg_modelo, bool oblig){
	TipoDato * t = (*reg_modelo)[reg_modelo->get_tamanio() - 1].clonar();
	TipoColec * colecc = new TipoColec( *t , oblig); 
	reg_modelo->quitar_dato(reg_modelo->get_tamanio() - 1);
	reg_modelo->add_dato(*colecc);
	delete colecc;
	delete t;
}

unsigned int FuncProcAtomCrear::operator() (const std::string &expr, TipoStruct* reg_modelo, unsigned int pos){
	//Obtengo los datos atomicos
	std::vector<std::string> tipos = Parser::split_parametros(expr, ',');
	TipoDato * dato_aux = NULL;
		
	std::vector<std::string>::iterator it = tipos.begin();
	//Recorro todo el vector de datos atomicos, y los intento meter en el tipo_struct, a partir de la pos
	//dada por param.
	while ( it != tipos.end() ){
		if( (*it).compare("*") == 0){
				reemplazar_struct_coleccion(reg_modelo, false);
		}
		else{
			if( (*it).compare("+") == 0){
				reemplazar_struct_coleccion(reg_modelo, true);
			}
			else{
				if( (*it).compare("") != 0){
					dato_aux = Parser::crear_tipo_desde_cadena(*it);
					if(dato_aux != NULL){
						reg_modelo->add_dato(*dato_aux);
						delete dato_aux;
					}
					else
						throw ExcepSintaxisParser("Error - Sintaxis incorrecta. Tipo de dato inexistente");
				}
				else{
					if( (*it).compare("") == 0)
						return 0;
					else
						throw ExcepSintaxisParser("Error - Sintaxis incorrecta");
				}
			}
		}
		it++;
	}
	
	return 0;
}
